Re: Returning multiple Rows from PL/pgSQL-Function

Поиск
Список
Период
Сортировка
От Alvar Freude
Тема Re: Returning multiple Rows from PL/pgSQL-Function
Дата
Msg-id 74854424.994690567@[192.168.100.219]
обсуждение исходный текст
Ответ на Re: Returning multiple Rows from PL/pgSQL-Function  ("Richard Huxton" <dev@archonet.com>)
Список pgsql-sql
>> How should I do this?
> 
> Can't at the moment.

ups, OK -- then I misunderstand something ;)

>> or, in more detail the exact function:
>> 
>> 
>>    CREATE FUNCTION get_emotions (timestamp) RETURNS SETOF records AS
>>          '
>>          DECLARE
>>             start ALIAS FOR $1;
>>             end_id int4;
>>          BEGIN
>>             SELECT emotion_id FROM emotions
>>                              WHERE date <= start
>>                              LIMIT 1
>>                               INTO end_id;
> 

> Not entirely clear what your function is for, but the above select looks a
> bit odd. Do you not want to "order by" here so you can get the "most
> recent" emotion_id or whatever?

In detail, I want 300 rows older then a specific date (timeslider), but
they are sorted by time AND an additional rating. For this i have to sort
the hole table without index -- but if i presort the 3000 rows before the
specific date and catch the 300 best rated/timed rows, i save lot of time. 

It's not critical if there are some faulty rows selected ...

This is the only reason to select a subpart (3000 Rows) of the table bevore
doing the final selection which rows should be taken.


> I'd rewrite this as just a select, or a view if you want to keep things
> clean in the application, possibly with that first select encapsulated in
> a function (sorry, I'm not entirely clear what your code is doing).
>
> so:
> 
> CREATE VIEW get_emotions_view AS
> SELECT emotion_id, emotion1, ...
> ORDER BY date_epoch + full_rating*3600*12
> LIMIT 300;

hmmm, but with this, the hole ORDER BY goes throug the hole table (might be
a lot of rows), with not using the index.

For now i do the hole stuff on client side with two selects:
First selecting the end_id, then (2. Statement) sort the stuff within
end_id and end_id-3000 and return the 300 most "best".


my $end_id = $self->db_h->selectrow_array(        "SELECT emotion_id            FROM emotions           WHERE date <= ?
         ORDER BY date DESC          LIMIT 1",          undef,           $self->date_from_sliderpos($params[0]));
 

my $st_h = $self->db_h->prepare(        "        SELECT emotion_id, emotion1, ..., full_rating, date
FROMemotions                     WHERE emotion_id BETWEEN ? AND ?                    ORDER BY date_epoch +
full_rating*(3600*12)                   LIMIT 300        ");
 

$st_h->execute($end_id-3000, $end_id) or die "execute kaputt";

$st_h->bind_columns(...); 
[...]


Thanks and Ciao
 Alvar


-- 
| AGI ............................................................... |
| Magirusstrasse 21B, 70469 Stuttgart . Fon +49 (0)711.228 74-50 .... |
| http://www.agi.com/diary/ (english) . http://www.agi.de/tagebuch/ . |
| >>>>>> NEWS >>> AGI holt Bronze-Loewen in Cannes! <<<<<<<<<<<<<<<<< |




В списке pgsql-sql по дате отправления:

Предыдущее
От: Alex Pilosov
Дата:
Сообщение: Re: Returning multiple Rows from PL/pgSQL-Function
Следующее
От: "Richard Huxton"
Дата:
Сообщение: Re: Returning multiple Rows from PL/pgSQL-Function